package demo2;

//在面向对象概念中，所有的对象可以用类来描述，但不是所有的类都是用来描述对象的
//如果一个类当中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类
//在类前面加上
abstract class Shape{
    //抽象方法
    public abstract void draw();
    //抽象类使用abstract修饰类
    // 抽象类当中可以包含普通类所能包含的成员
    // 抽象类和普通类不一样的是抽象类可以使用抽象方法
    // 抽象方法是使用abstract修饰的，这个方法没有具体的实现
    // 而且不能实例化对象出来
    // 抽象类存在的最大意义就是为了被继承
    // 如果一个普通类继承了一个抽象类必须重写抽象类中的抽象方法
}

class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}
class Cycle extends Shape {
    @Override
    public void draw(){
        System.out.println("画圆");
    }
}

class Triangle extends Shape {
    public void draw(){
        System.out.println("画三角形");
    }
}

class Flower extends Shape {
    public void draw(){
        System.out.println("花！");
    }
}
//如果是一个抽象类继承了抽象类，那么不需要重写抽象方法
abstract class A extends Shape{}

public class Test {
    public static void drawMap(Shape shape){
        shape.draw();
    }
    //在drawMap方法中，Shape shape引用的子类对象不一样，调用方法表现出来的行为不一样，这种思想就叫做多态
    public static void main1(String[] args) {
        drawMap(new Rect());   //这里用匿名对象，省略了创建对象这一步
        drawMap(new Cycle());
        drawMap(new Triangle());
        drawMap(new Flower());
    }
}
